	ORG	04000H

START:	JP	INITMUSDAT
	JP	REPLAYROUT
	JP	ALMUSICOFF
	JP	SETVOLUDEC
	JP	SETVOLUINC

;----------------------------------------------------------------------------
	DEFB	0,0,0,0,0   ;Psg1
	DEFB	0,0,0,0,0   ;Psg2
	DEFB	0,0,0,0,0   ;Psg3
	DEFB	0,0,0,0,0   ;Drum
	DEFB	0,0,0,0,0   ;Instrument-0
	DEFB	0,0,0,0,0   ;Fm1
	DEFB	0,0,0,0,0   ;Fm2
	DEFB	0,0,0,0,0   ;Fm3
	DEFB	0,0,0,0,0   ;Fm4
	DEFB	0,0,0,0,0   ;Fm5
	DEFB	0,0,0,0,0   ;Fm6
	DEFB	0,0,0,0,0   ;Fm7
	DEFB	0,0,0,0,0   ;Fm8
	DEFB	0,0,0,0,0   ;Fm9

	;Dit zijn 5 bytes (variabelen) per kanaal die alleen
	;intern door bepaalde routines worden gebruikt.

;----------------------------------------------------------------------------

REPMUSMODE: DEFB	0	; 0=Geen drums, 1=wel drums (6 FM voices)
REPDRUMFRQ: DEFB	100,100,100	; Frequenties van drums
REPSPEED:	DEFB	10	; Speed van muziek
REPLASTLIN: DEFW	63	; Laatste step
REPNEWLINE: DEFW	0	; Eerste stepnr. voor herhaling
REPHERHAAL: DEFB	1	; herhaal muziek of niet
REPSTARTIN: DEFB	0	; Start Instrument-0

;----------------------------------------------------------------------------

REPMUSDATA: DEFB	0,0,0,0,0   ;Psg1
	DEFB	0,0,0,0,0   ;Psg2
	DEFB	0,0,0,0,0   ;Psg3
	DEFB	0,0,0,0,0   ;Drum
	DEFB	0,0,0,0,0   ;Instrument-0
	DEFB	0,0,0,0,0   ;Fm1
	DEFB	0,0,0,0,0   ;Fm2
	DEFB	0,0,0,0,0   ;Fm3
	DEFB	0,0,0,0,0   ;Fm4
	DEFB	0,0,0,0,0   ;Fm5
	DEFB	0,0,0,0,0   ;Fm6
	DEFB	0,0,0,0,0   ;Fm7
	DEFB	0,0,0,0,0   ;Fm8
	DEFB	0,0,0,0,0   ;Fm9

	; Dit datablok bevat per muziekkanaal de volgende data:

	; 1e byte   : betreffende track staat aan (1) of uit (0)
	; 2e byte   : dit is een counter
	; 3e byte   : dit is de memorymap waar de data van de track staat.
	; 4e/5e byte: RAM adres van muziekdata. Dit adres wordt met 4
	;	       verhoogd, nadat de counter 0 is geworden.
;-----------------------------------------------------------------------------

REPVARDATA: DEFB	0,0,0,0,0   ;Psg1
	DEFB	0,0,0,0,0   ;Psg2
	DEFB	0,0,0,0,0   ;Psg3
	DEFB	0,0,0,0,0   ;Drum
	DEFB	0,0,0,0,0   ;Instrument-0
	DEFB	0,0,0,0,0   ;Fm1
	DEFB	0,0,0,0,0   ;Fm2
	DEFB	0,0,0,0,0   ;Fm3
	DEFB	0,0,0,0,0   ;Fm4
	DEFB	0,0,0,0,0   ;Fm5
	DEFB	0,0,0,0,0   ;Fm6
	DEFB	0,0,0,0,0   ;Fm7
	DEFB	0,0,0,0,0   ;Fm8
	DEFB	0,0,0,0,0   ;Fm9


	; Deze data wordt gebruikt voor het opslaan van effect-adressen
	; en momentele registerinhouden van de OPLL/PSG chip.

	; 1e/2e byte: het momentele adres van een effect-programma.
	; 3e byte   : voor opslaan van een octave/grove toon-register.
	; 4e byte   : voor opslaan van fijne toon-register.
	; 5e byte   : voor opslaan van een volume/instrument-register.

;----------------------------------------------------------------------------

SETVOLUDEC: LD	A,1
SETVOLUDCB: LD	(CHANGEVOL),A
	LD	C,B
	LD	(CHGVOLWERK),BC
	RET
SETVOLUINC: LD	A,255
	JR	SETVOLUDCB

;----------------------------------------------------------------------------
;De volgende adressen wijzen elk naar een effect van de PSG

PSGEFFECTS: DEFW	EFFECT0
	DEFW	EFFPSG1
	DEFW	EFFPSG2
	DEFW	EFFPSG3
	DEFW	EFFPSG4
	DEFW	EFFPSG5
	DEFW	EFFPSG6
	DEFW	EFFPSG7
	DEFW	EFFPSG8
	DEFW	EFFPSG9
	DEFW	EFFPSG10
	DEFW	EFFPSG11
	DEFW	EFFPSG12
	DEFW	EFFPSG13
	DEFW	EFFPSG14
	DEFW	EFFPSG15
	DEFW	EFFPSG16
	DEFW	EFFPSG17
	DEFW	EFFPSG18
	DEFW	EFFPSG19
	DEFW	EFFPSG20
	DEFW	EFFPSG21
	DEFW	EFFPSG22
	DEFW	EFFPSG23
	DEFW	EFFPSG24
	DEFW	EFFPSG25
	DEFW	EFFPSG26
	DEFW	EFFPSG27
	DEFW	EFFPSG28
	DEFW	EFFPSG29
	DEFW	EFFPSG30
	DEFW	EFFPSG31
	DEFW	EFFPSG32
	DEFW	EFFPSG33
	DEFW	EFFPSG34
	DEFW	EFFPSG35
	DEFW	EFFPSG36
	DEFW	EFFPSG37
	DEFW	EFFPSG38
	DEFW	EFFPSG39
	DEFW	EFFPSG40
	DEFW	EFFPSG41
	DEFW	EFFPSG42
	DEFW	EFFPSG43
	DEFW	EFFPSG44
	DEFW	EFFPSG45
	DEFW	EFFPSG46
	DEFW	EFFPSG47
	DEFW	EFFPSG48
	DEFW	EFFPSG49
	DEFW	EFFPSG50
	DEFW	EFFPSG51
	DEFW	EFFPSG52
	DEFW	EFFPSG53
	DEFW	EFFPSG54
	DEFW	EFFPSG55
	DEFW	EFFPSG56
	DEFW	EFFPSG57
	DEFW	EFFPSG58
	DEFW	EFFPSG59
	DEFW	EFFPSG60
	DEFW	EFFPSG61
	DEFW	EFFPSG62
	DEFW	EFFPSG63
	DEFW	EFFPSG64
	DEFW	EFFPSG65
	DEFW	EFFPSG66
	DEFW	EFFPSG67
	DEFW	EFFPSG68
	DEFW	EFFPSG69
	DEFW	EFFPSG70
	DEFW	EFFPSG71
	DEFW	EFFPSG72
	DEFW	EFFPSG73
	DEFW	EFFPSG74
	DEFW	EFFPSG75
	DEFW	EFFPSG76
	DEFW	EFFPSG77
	DEFW	EFFPSG78
	DEFW	EFFPSG79
	DEFW	EFFPSG80

;De volgende adressen wijzen elk naar een effect van FM

FMPEFFECTS: DEFW	EFFECT0
	DEFW	EFFFM1
	DEFW	EFFFM2
	DEFW	EFFFM3
	DEFW	EFFFM4
	DEFW	EFFFM5
	DEFW	EFFFM6
	DEFW	EFFFM7
	DEFW	EFFFM8
	DEFW	EFFFM9
	DEFW	EFFFM10
	DEFW	EFFFM11
	DEFW	EFFFM12
	DEFW	EFFFM13
	DEFW	EFFFM14
	DEFW	EFFFM15
	DEFW	EFFFM16
	DEFW	EFFFM17
	DEFW	EFFFM18
	DEFW	EFFFM19
	DEFW	EFFFM20
	DEFW	EFFFM21
	DEFW	EFFFM22
	DEFW	EFFFM23
	DEFW	EFFFM24
	DEFW	EFFFM25
	DEFW	EFFFM26
	DEFW	EFFFM27
	DEFW	EFFFM28
	DEFW	EFFFM29
	DEFW	EFFFM30
	DEFW	EFFFM31
	DEFW	EFFFM32
	DEFW	EFFFM33
	DEFW	EFFFM34
	DEFW	EFFFM35
	DEFW	EFFFM36
	DEFW	EFFFM37
	DEFW	EFFFM38
	DEFW	EFFFM39
	DEFW	EFFFM40
	DEFW	EFFFM41
	DEFW	EFFFM42
	DEFW	EFFFM43
	DEFW	EFFFM44
	DEFW	EFFFM45
	DEFW	EFFFM46
	DEFW	EFFFM47
	DEFW	EFFFM48
	DEFW	EFFFM49
	DEFW	EFFFM50
	DEFW	EFFFM51
	DEFW	EFFFM52
	DEFW	EFFFM53
	DEFW	EFFFM54
	DEFW	EFFFM55
	DEFW	EFFFM56
	DEFW	EFFFM57
	DEFW	EFFFM58
	DEFW	EFFFM59
	DEFW	EFFFM60
	DEFW	EFFFM61
	DEFW	EFFFM62
	DEFW	EFFFM63
	DEFW	EFFFM64
	DEFW	EFFFM65
	DEFW	EFFFM66
	DEFW	EFFFM67
	DEFW	EFFFM68
	DEFW	EFFFM69
	DEFW	EFFFM70
	DEFW	EFFFM71
	DEFW	EFFFM72
	DEFW	EFFFM73
	DEFW	EFFFM74
	DEFW	EFFFM75
	DEFW	EFFFM76
	DEFW	EFFFM77
	DEFW	EFFFM78
	DEFW	EFFFM79
	DEFW	EFFFM80

;----------------------------------------------------------------------------

REPMUSADR:	DEFW	0	; Beginadres van muziek
REPACTSTEP: DEFW	0	;actuele stepnr.
REPCOUNTER: DEFB	0	;Counter van speed.
REPDECVOLU: DEFB	0	;volumevermindering.
CHANGEVOL:	DEFB	0
CHGVOLWERK: DEFB	0
CHGVOLTIME: DEFB	0
RUISFREQ:	DEFB	0

;----------------------------------------------------------------------------

; Deze routine moet altijd aan het begin worden aangeroepen om een muziek-
; stuk te initialiseren. Invoer: HL=eerste geheugenadres waar header van
; muziekstuk begint.

INITMUSDAT: DI
	LD	(REPMUSADR),HL
	LD	DE,REPMUSMODE
	LD	BC,81
	LDIR
	LD	A,1
	LD	(REPCOUNTER),A
	LD	HL,0
	LD	(REPDECVOLU),HL
	LD	(REPACTSTEP),HL
	CALL	INITMUSDAZ
	LD	BC,0B807H
	CALL	WRTPSG
	LD	BC,00600H
INITMUSINC: XOR	A
	CALL	WRTPSG3
	INC	C
	DJNZ	INITMUSINC
	LD	IX,REPVARDATA+25
	LD	DE,5
	LD	A,(REPSTARTIN)
	RRC	A
	RRC	A
	RRC	A
	RRC	A
	XOR	15
	LD	BC,00930H
INITMUSINA: CALL	WRTOPLL3
	LD	(IX+4),A
	INC	C
	ADD	IX,DE
	DJNZ	INITMUSINA
	XOR	15
	AND	15
	LD	BC,00308H
	LD	IX,REPVARDATA
INITMUSINB: CALL	WRTPSG3
	LD	(IX+4),A
	INC	C
	ADD	IX,DE
	DJNZ	INITMUSINB
	LD	BC,0000EH
	CALL	WRTOPLL
	LD	A,(REPMUSMODE)
	OR	A
	RET	Z
	LD	IX,REPDRUMFRQ
	LD	L,(IX+0)
	LD	H,(IX+1)
	LD	E,(IX+2)
INITDRMFRQ: LD	D,016H
	LD	A,L
	CALL	INITDRMFRB
	INC	D
	LD	A,H
	CALL	INITDRMFRB
	INC	D
	LD	A,E
INITDRMFRB: PUSH	AF
	SLA	A
	SLA	A
	SLA	A
	LD	B,A
	LD	C,D
	CALL	WRTOPLL
	POP	AF
	SRL	A
	SRL	A
	SRL	A
	SRL	A
	AND	14
	OR	1
	LD	B,A
	LD	C,D
	SET	5,C
	RES	4,C
	JP	WRTOPLL

INITMUSDAZ: LD	HL,EFFECT0
	LD	(REPVARDATA),HL
	LD	(REPVARDATA+5),HL
	LD	(REPVARDATA+10),HL
	LD	(REPVARDATA+15),HL
	LD	(REPVARDATA+20),HL
	LD	(REPVARDATA+25),HL
	LD	(REPVARDATA+30),HL
	LD	(REPVARDATA+35),HL
	LD	(REPVARDATA+40),HL
	LD	(REPVARDATA+45),HL
	LD	(REPVARDATA+50),HL
	LD	(REPVARDATA+55),HL
	LD	(REPVARDATA+60),HL
	LD	(REPVARDATA+65),HL
	RET

;----------------------------------------------------------------------------

ALMUSICOFF: DI
	LD	HL,0
	LD	(REPDECVOLU),HL
	LD	BC,0B807H
	CALL	WRTPSG
	LD	C,0
	LD	D,6
ALMUSICOFB: LD	B,0
	CALL	WRTPSG
	INC	C
	DEC	D
	JR	NZ,ALMUSICOFB
	LD	BC,00008H
	CALL	WRTPSG
	LD	IX,REPVARDATA+25
	LD	DE,5
	LD	H,9
	LD	C,020H
ALMUSICOFC: LD	B,(IX+2)
	SET	5,B
	CALL	WRTOPLL
	ADD	IX,DE
	INC	C
	DEC	H
	JR	NZ,ALMUSICOFC
	JP	INITMUSDAZ

;----------------------------------------------------------------------------

; Dit is het hoofdprogramma. Als het nog geen tijd is om een nieuwe toon in
; te stellen, dan wordt er altijd naar REPINTERRU gesprongen.
; Als dit wel het geval is (COUNTER=0) dan wordt er gekeken of het einde al
; bereikt is. Zoniet, dan wordt er naar REPNEWTOON gesprongen. Anders wordt
; er gekeken of het de bedoeling is dat het muziekstuk herhaald moet worden.
; Zoja dan wordt (REPACTSTEP) aangepast en wordt een stuk van de header van
; de muziek naar REPMUSDATA gekopieerd. Is dit niet het geval, dan wordt er
; niets gedaan (EINDE MUZIEK).

REPLAYROUT: LD	HL,CHANGEVOL
	BIT	0,(HL)
	JP	Z,REPLAYROUX
	INC	HL
	DEC	(HL)
	JP	NZ,REPLAYROUX
	INC	HL
	LD	A,(HL)
	DEC	HL
	LD	(HL),A
	DEC	HL
	LD	A,(REPDECVOLU)
	ADD	A,(HL)
	CP	16
	JR	C,REPLAYROUV
	LD	(HL),0
	LD	B,5
	RET
REPLAYROUV: LD	(REPDECVOLU),A
	LD	A,(REPMUSDATA)
	BIT	0,A
	JR	Z,REPLAYROOF
	LD	A,(0F3ACH)
	OR	A
	JR	NZ,REPLAYROOF
	LD	BC,(REPMUSDATA+73)
	LD	C,8
	CALL	WRTVOLUPSG
REPLAYROOF: LD	IX,REPMUSDATA+5
	LD	DE,5
	LD	H,2
	LD	C,009H
REPLAYROUW: BIT	0,(IX+0)
	JR	Z,REPLAYROUY
	LD	B,(IX+74)
	PUSH	BC
	CALL	WRTVOLUPSG
	POP	BC
REPLAYROUY: ADD	IX,DE
	INC	C
	DEC	H
	JR	NZ,REPLAYROUW
	LD	IX,REPMUSDATA+25
	LD	H,9
	LD	C,030H
REPLAYROUQ: BIT	0,(IX+0)
	JR	Z,REPLAYROUP
	LD	B,(IX+74)
	CALL	WRTVOLUFMB
REPLAYROUP: ADD	IX,DE
	INC	C
	DEC	H
	JR	NZ,REPLAYROUQ
	LD	B,4
	RET

REPLAYROUX: LD	HL,REPCOUNTER
	DEC	(HL)
	JP	NZ,REPINTERRU
	LD	A,(REPSPEED)
	LD	(HL),A
	LD	HL,(REPACTSTEP)
	LD	DE,(REPLASTLIN)
	OR	A
	SBC	HL,DE
	JR	NZ,REPLAYB
	LD	A,(REPHERHAAL)
	OR	A
	JR	Z,REPLAYC
	LD	HL,(REPNEWLINE)
	LD	(REPACTSTEP),HL
	LD	HL,(REPMUSADR)
	LD	DE,81
	ADD	HL,DE
	LD	DE,REPMUSDATA
	LD	BC,70
	LDIR
	LD	A,1
	LD	(REPCOUNTER),A
	LD	B,3
	RET

REPLAYC:	LD	B,2
	RET

REPLAYB:	LD	HL,(REPACTSTEP)
	INC	HL
	LD	(REPACTSTEP),HL

;----------------------------------------------------------------------------

;Deze routine wordt om de "SPEED" interrupten aangeroepen om een eventuele
;nieuwe toon in te stellen.


REPNEWTOON: LD	BC,4
	LD	IX,REPMUSDATA	 ;3 Psg kanalen
	CALL	REPINITPSA
	LD	IX,REPMUSDATA+5
	CALL	REPINITPSG
	LD	IX,REPMUSDATA+10
	CALL	REPINITPSG

	LD	IX,REPMUSDATA+15 ;Drum kanaal
	CALL	REPINITDRM

	LD	IX,REPMUSDATA+20 ;Instrument-0 kanaal
	CALL	REPINITIN0

	LD	IX,REPMUSDATA+25 ;9 Fm kanalen
	CALL	REPINITFMP
	LD	IX,REPMUSDATA+30
	CALL	REPINITFMP
	LD	IX,REPMUSDATA+35
	CALL	REPINITFMP
	LD	IX,REPMUSDATA+40
	CALL	REPINITFMP
	LD	IX,REPMUSDATA+45
	CALL	REPINITFMP
	LD	IX,REPMUSDATA+50
	CALL	REPINITFMP
	LD	IX,REPMUSDATA+55
	CALL	REPINITFMP
	LD	IX,REPMUSDATA+60
	CALL	REPINITFMP
	LD	IX,REPMUSDATA+65
	CALL	REPINITFMP
	LD	B,1
	RET

REPINITFMP: BIT	0,(IX+0)
	RET	Z
	DEC	(IX+1)
	RET	NZ
	LD	L,(IX+3)
	LD	H,(IX+4)
	ADD	HL,BC
	LD	(IX+3),L
	LD	(IX+4),H
	LD	E,(HL)
	ADD	HL,BC
	DEC	HL
	LD	D,(HL)
	LD	(IX+1),D
	SLA	E
	RET	Z
	LD	D,0
	LD	HL,FMPEFFECTS
	ADD	HL,DE
	LD	E,(HL)
	INC	HL
	LD	D,(HL)
	LD	(IX+70),E
	LD	(IX+71),D
	RET

REPINITPSG: BIT	0,(IX+0)
	RET	Z
	DEC	(IX+1)
	RET	NZ
	LD	L,(IX+3)
	LD	H,(IX+4)
	ADD	HL,BC
	LD	(IX+3),L
	LD	(IX+4),H
	LD	E,(HL)
	ADD	HL,BC
	DEC	HL
	LD	D,(HL)
	LD	(IX+1),D
	SLA	E
	RET	Z
	LD	D,0
	LD	HL,PSGEFFECTS
	ADD	HL,DE
	LD	E,(HL)
	INC	HL
	LD	D,(HL)
	LD	(IX+70),E
	LD	(IX+71),D
	RET

REPINITPSA: BIT	0,(IX+0)
	RET	Z
	DEC	(IX+1)
	RET	NZ
	LD	L,(IX+3)
	LD	H,(IX+4)
	ADD	HL,BC
	LD	(IX+3),L
	LD	(IX+4),H
	LD	E,(HL)
	ADD	HL,BC
	DEC	HL
	LD	D,(HL)
	LD	(IX+1),D
	SLA	E
	RET	Z
	LD	A,(0F3ACH)
	OR	A
	JR	NZ,REPINITPSB
	LD	D,0
	LD	HL,PSGEFFECTS
	ADD	HL,DE
	LD	E,(HL)
	INC	HL
	LD	D,(HL)
	LD	(IX+70),E
	LD	(IX+71),D
	RET
REPINITPSB: LD	HL,EFFECT0
	LD	(IX+70),L
	LD	(IX+71),H
	RET

REPINITDRM: BIT	0,(IX+0)
	RET	Z
	DEC	(IX+1)
	RET	NZ
	LD	L,(IX+3)
	LD	H,(IX+4)
	ADD	HL,BC
	LD	(IX+3),L
	LD	(IX+4),H
	ADD	HL,BC
	DEC	HL
	LD	A,(HL)
	LD	D,A
	AND	63
	LD	(IX+1),A
	BIT	6,D
	RET	Z
	LD	DE,EFFDRUM
	LD	(IX+70),E
	LD	(IX+71),D
	RET

REPINITIN0: BIT	0,(IX+0)
	RET	Z
	DEC	(IX+1)
	RET	NZ
	LD	L,(IX+3)
	LD	H,(IX+4)
	LD	DE,10
	ADD	HL,DE
	LD	(IX+3),L
	LD	(IX+4),H
	LD	A,(HL)
	ADD	HL,DE
	DEC	HL
	LD	D,(HL)
	LD	(IX+1),D
	OR	A
	RET	Z
	LD	DE,EFFINSTRU
	LD	(IX+70),E
	LD	(IX+71),D
	RET
;----------------------------------------------------------------------------

;Deze routine wordt elke interrupt aangeroepen.


REPINTERRU: LD	A,(REPMUSDATA)
	OR	A
	JR	Z,REPINTERR2
	LD	A,(0F3ACH)
	OR	A
	JR	NZ,REPINTERR2
	LD	IX,REPMUSDATA
	LD	IY,(REPVARDATA)
	LD	DE,00008H
	CALL	REPGOFORIT
	LD	(REPVARDATA),IY
REPINTERR2: LD	A,(REPMUSDATA+5)
	OR	A
	JR	Z,REPINTERR3
	LD	IX,REPMUSDATA+5
	LD	IY,(REPVARDATA+5)
	LD	DE,00209H
	CALL	REPGOFORIT
	LD	(REPVARDATA+5),IY
REPINTERR3: LD	A,(REPMUSDATA+10)
	OR	A
	JR	Z,REPINTERR4
	LD	IX,REPMUSDATA+10
	LD	IY,(REPVARDATA+10)
	LD	DE,0040AH
	CALL	REPGOFORIT
	LD	(REPVARDATA+10),IY
REPINTERR4: LD	A,(REPMUSDATA+15)
	OR	A
	JR	Z,REPINTERR5
	LD	IX,REPMUSDATA+15
	LD	IY,(REPVARDATA+15)
	CALL	REPGOFORIT
	LD	(REPVARDATA+15),IY
REPINTERR5: LD	A,(REPMUSDATA+20)
	OR	A
	JR	Z,REPINTERR6
	LD	IX,REPMUSDATA+20
	LD	IY,(REPVARDATA+20)
	CALL	REPGOFORIT
	LD	(REPVARDATA+20),IY
REPINTERR6: LD	A,(REPMUSDATA+25)
	OR	A
	JR	Z,REPINTERR7
	LD	IX,REPMUSDATA+25
	LD	IY,(REPVARDATA+25)
	LD	DE,01030H
	CALL	REPGOFORIT
	LD	(REPVARDATA+25),IY
REPINTERR7: LD	A,(REPMUSDATA+30)
	OR	A
	JR	Z,REPINTERR8
	LD	IX,REPMUSDATA+30
	LD	IY,(REPVARDATA+30)
	LD	DE,01131H
	CALL	REPGOFORIT
	LD	(REPVARDATA+30),IY
REPINTERR8: LD	A,(REPMUSDATA+35)
	OR	A
	JR	Z,REPINTERR9
	LD	IX,REPMUSDATA+35
	LD	IY,(REPVARDATA+35)
	LD	DE,01232H
	CALL	REPGOFORIT
	LD	(REPVARDATA+35),IY
REPINTERR9: LD	A,(REPMUSDATA+40)
	OR	A
	JR	Z,REPINTERRA
	LD	IX,REPMUSDATA+40
	LD	IY,(REPVARDATA+40)
	LD	DE,01333H
	CALL	REPGOFORIT
	LD	(REPVARDATA+40),IY
REPINTERRA: LD	A,(REPMUSDATA+45)
	OR	A
	JR	Z,REPINTERRB
	LD	IX,REPMUSDATA+45
	LD	IY,(REPVARDATA+45)
	LD	DE,01434H
	CALL	REPGOFORIT
	LD	(REPVARDATA+45),IY
REPINTERRB: LD	A,(REPMUSDATA+50)
	OR	A
	JR	Z,REPINTERRC
	LD	IX,REPMUSDATA+50
	LD	IY,(REPVARDATA+50)
	LD	DE,01535H
	CALL	REPGOFORIT
	LD	(REPVARDATA+50),IY
REPINTERRC: LD	A,(REPMUSDATA+55)
	OR	A
	JR	Z,REPINTERRD
	LD	IX,REPMUSDATA+55
	LD	IY,(REPVARDATA+55)
	LD	DE,01636H
	CALL	REPGOFORIT
	LD	(REPVARDATA+55),IY
REPINTERRD: LD	A,(REPMUSDATA+60)
	OR	A
	JR	Z,REPINTERRE
	LD	IX,REPMUSDATA+60
	LD	IY,(REPVARDATA+60)
	LD	DE,01737H
	CALL	REPGOFORIT
	LD	(REPVARDATA+60),IY
REPINTERRE: LD	A,(REPMUSDATA+65)
	OR	A
	JR	Z,REPINTERRG
	LD	IX,REPMUSDATA+65
	LD	IY,(REPVARDATA+65)
	LD	DE,01838H
	CALL	REPGOFORIT
	LD	(REPVARDATA+65),IY
REPINTERRG: LD	B,0
	RET
;----------------------------------------------------------------------------

;Deze routine hoort bij REPINTERRU om naar de goede effectroutine te springen.


REPGOFORIT: CALL	REPGOFORI2
	JR	REPGOFORIT

REPGOFORI2: LD	L,(IY+0)
	LD	H,(IY+1)
	JP	(HL)
;-----------------------------------------------------------------------------

;Een opsomming van effecten.

EFFECT0:	DEFW	ENDLESS

EFFDRUM:	DEFW	PUTDRUMS,ENDLESS    ;Voor drums is er 1 mogelijk effect.

EFFINSTRU:	DEFW	PUTINSTRU0,ENDLESS  ;Voor instrument-0 is er 1 effect.

EFFPSG1:	DEFW	PSGOFF,ENDLESS
EFFPSG2:	DEFW	WAITINT,WAITINT,PSGDECVOLU,WAITINT,JUMPBACK
	DEFB	8
EFFPSG3:	DEFW	PSGNOT,ENDLESS
EFFPSG4:	DEFW	PSGNOTVOLU,ENDLESS
EFFPSG5:	DEFW	PSGNOTVOLU
EFFPSG6:	DEFW	COPYVAR,ISTIJD,PSGDECVOLU,JUMPBACK
	DEFB	4
EFFPSG7:	DEFW	PSGNOTVOLU,COPYVAR,ISTIJD,SETPSGVOLU
	DEFB	0
	DEFW	ISTIJD,PSGVOLUME,JUMPBACK
	DEFB	9
EFFPSG8:	DEFW	PSGNOTVOLU,COPYVAR,ISTIJD,SETPSGVOLU
	DEFB	0
EFFPSG9:	DEFW	ENDLESS
EFFPSG10:	DEFW	PSGNOT
EFFPSG11:	DEFW	COPYVAR,PSGVOLUME,PSSLIDEUPA,JUMPBACK
	DEFB	2
EFFPSG12:	DEFW	PSGNOT
EFFPSG13:	DEFW	COPYVAR,PSGVOLUME,PSSLIDEUPB,JUMPBACK
	DEFB	2
EFFPSG14:	DEFW	PSGNOT
EFFPSG15:	DEFW	COPYVAR,PSGVOLUME,ISTIJD,PSSLIDEUPC,JUMPBACK
	DEFB	4
EFFPSG16:	DEFW	PSGNOT
EFFPSG17:	DEFW	COPYVAR,PSGVOLUME,PSSLIDEDOA,JUMPBACK
	DEFB	2
EFFPSG18:	DEFW	PSGNOT
EFFPSG19:	DEFW	COPYVAR,PSGVOLUME,PSSLIDEDOB,JUMPBACK
	DEFB	2
EFFPSG20:	DEFW	PSGNOT
EFFPSG21:	DEFW	COPYVAR,PSGVOLUME,ISTIJD,PSSLIDEDOC,JUMPBACK
	DEFB	4
EFFPSG22:	DEFW	COPYVAR,PSGVOLUME,PSSLIDEUPA,ENDLESS
EFFPSG23:	DEFW	COPYVAR,PSGVOLUME,PSSLIDEUPB,ENDLESS
EFFPSG24:	DEFW	COPYVAR,PSGVOLUME,PSSLIDEDOA,ENDLESS
EFFPSG25:	DEFW	COPYVAR,PSGVOLUME,PSSLIDEDOB,ENDLESS
EFFPSG26:	EQU	EFFPSG4
EFFPSG27:	DEFW	PSONLYVOLU,ENDLESS
EFFPSG28:	DEFW	PSGNOT
EFFPSG29:	DEFW	COPYVAR,PSGVOLUME,PSSLIDEDOD
	DEFB	2
	DEFW	ISTIJD,PSSLIDEUPD
	DEFB	2
	DEFW	ISTIJD,JUMPBACK
	DEFB	10
EFFPSG30:	DEFW	PSGNOT
EFFPSG31:	DEFW	COPYVAR,PSGVOLUME,PSSLIDEDOD
	DEFB	5
	DEFW	ISTIJD,PSSLIDEUPD
	DEFB	5
	DEFW	ISTIJD,JUMPBACK
	DEFB	10
EFFPSG32:	DEFW	PSGNOT
EFFPSG33:	DEFW	COPYVAR,PSGVOLUME,PSSLIDEDOD
	DEFB	12
	DEFW	ISTIJD,PSSLIDEUPD
	DEFB	12
	DEFW	ISTIJD,JUMPBACK
	DEFB	10
EFFPSG34:	DEFW	PSGNOT
EFFPSG35:	DEFW	COPYVAR,PSGVOLUME,PSSLIDEDOD
	DEFB	20
	DEFW	ISTIJD,PSSLIDEUPD
	DEFB	20
	DEFW	ISTIJD,JUMPBACK
	DEFB	10
EFFPSG36:	DEFW	PSGNOT
EFFPSG37:	DEFW	COPYVAR,PSGVOLUME,PSSLIDEDOC,ISTIJD2
	DEFB	2
	DEFW	PSSLIDEUPC,ISTIJD2
	DEFB	2
	DEFW	JUMPBACK
	DEFB	10
EFFPSG38:	DEFW	PSGNOT
EFFPSG39:	DEFW	COPYVAR,PSGVOLUME,PSSLIDEDOD
	DEFB	2
	DEFW	ISTIJD2
	DEFB	3
	DEFW	PSSLIDEUPD
	DEFB	2
	DEFW	ISTIJD2
	DEFB	3
	DEFW	JUMPBACK
	DEFB	12
EFFPSG40:	DEFW	PSGNOT
EFFPSG41:	DEFW	COPYVAR,PSGVOLUME,PSSLIDEDOD
	DEFB	4
	DEFW	ISTIJD2
	DEFB	3
	DEFW	PSSLIDEUPD
	DEFB	4
	DEFW	ISTIJD2
	DEFB	3
	DEFW	JUMPBACK
	DEFB	12
EFFPSG42:	DEFW	PSGNOT
EFFPSG43:	DEFW	COPYVAR,PSGVOLUME,PSSLIDEDOC,WAITINT,ISTIJD2
	DEFB	4
	DEFW	PSSLIDEUPC,WAITINT,ISTIJD2
	DEFB	4
	DEFW	JUMPBACK
	DEFB	14
EFFPSG44:	DEFW	PSGNOTVOLU,COPYVAR,WAITINT,WAITINT,PSGDECVOLU,PSSLIDEUPA
	DEFW	JUMPBACK
	DEFB	4
EFFPSG45:	DEFW	PSGNOTVOLU,COPYVAR,WAITINT,WAITINT,PSGDECVOLU,PSSLIDEUPA
	DEFW	WAITINT,WAITINT,JUMPBACK
	DEFB	8
EFFPSG46:	DEFW	PSGNOTVOLU,COPYVAR,WAITINT,WAITINT,PSGDECVOLU,PSSLIDEDOA
	DEFW	JUMPBACK
	DEFB	4
EFFPSG47:	DEFW	PSGNOTVOLU,COPYVAR,WAITINT,WAITINT,PSGDECVOLU,PSSLIDEDOA
	DEFW	WAITINT,WAITINT,JUMPBACK
	DEFB	8
EFFPSG48:	DEFW	SETSPEEDP,ENDLESS
EFFPSG49:	DEFW	PSGNOTVOLU
EFFPSG50:	DEFW	COPYVAR,PSGDECVOLU,ISTIJD2
	DEFB	2
	DEFW	PSGINCVOLU,ISTIJD2
	DEFB	2
	DEFW	JUMPBACK
	DEFB	10
EFFPSG51:	DEFW	PSGNOTVOLU
EFFPSG52:	DEFW	COPYVAR,PSGDECVOLU,WAITINT,ISTIJD2
	DEFB	4
	DEFW	PSGINCVOLU,WAITINT,ISTIJD2
	DEFB	4
	DEFW	JUMPBACK
	DEFB	14
EFFPSG53:	DEFW	PSGNOTVOLU
EFFPSG54:	DEFW	COPYVAR,PSGDECVOLU,WAITINT,WAITINT,WAITINT,ISTIJD2
	DEFB	8
	DEFW	PSGINCVOLU,WAITINT,WAITINT,WAITINT,ISTIJD2
	DEFB	8
	DEFW	JUMPBACK
	DEFB	22
EFFPSG55:	DEFW	PSGNOTVOLU
EFFPSG56:	DEFW	COPYVAR,ISTIJD,PSGINCVOLU,JUMPBACK
	DEFB	4
EFFPSG57:	DEFW	PSGNOTVOLU,COPYVAR,ISTIJD,WAITINT,PSSLIDEVOLU
	DEFB	253
	DEFW	ISTIJD,WAITINT
	DEFW	PSSLIDEVOLU
	DEFB	2
	DEFW	JUMPBACK
	DEFB	14
EFFPSG58:	DEFW	PSGNOTVOLU,COPYVAR,ISTIJD,WAITINT,PSSLIDEVOLU
	DEFB	252
	DEFW	ISTIJD,WAITINT
	DEFW	PSSLIDEVOLU
	DEFB	2
	DEFW	JUMPBACK
	DEFB	14
EFFPSG59:	DEFW	PSGNOTVOLU,COPYVAR,ISTIJD,WAITINT,PSSLIDEVOLU
	DEFB	250
	DEFW	ISTIJD,WAITINT
	DEFW	PSSLIDEVOLU
	DEFB	3
	DEFW	JUMPBACK
	DEFB	14
EFFPSG60:	DEFW	ENDLESS
EFFPSG61:	EQU	EFFPSG60
EFFPSG62:	EQU	EFFPSG60
EFFPSG63:	EQU	EFFPSG60
EFFPSG64:	DEFW	COPYVAR,PSGVOLUME,ONLYRUIS,SETRUISFRQ,PSGDECVOLU,JUMPBACK
	DEFB	2
EFFPSG65:	DEFW	COPYVAR,PSGVOLUME,ONLYRUIS,SETRUISFRQ,PSGDECVOLU,WAITINT,JUMPBACK
	DEFB	4
EFFPSG66:	DEFW	COPYVAR,PSGVOLUME,ONLYRUIS,SETRUISFRQ,PSGDECVOLU,WAITINT,WAITINT
	DEFW	JUMPBACK
	DEFB	6
EFFPSG67:	DEFW	COPYVAR,PSGVOLUME,ONLYRUIS,SETRUISFRQ,PSGDECVOLU
	DEFW	WAITINT,WAITINT,WAITINT,WAITINT,JUMPBACK
	DEFB	10
EFFPSG68:	DEFW	COPYVAR,PSGVOLUME,ONLYRUIS,SETRUISFRQ,JUMP,EFFHULP+14
EFFPSG69:	DEFW	COPYVAR,PSGVOLUME,ONLYRUIS,SETRUISFRQ,JUMP,EFFHULP+12
EFFPSG70:	DEFW	COPYVAR,PSGVOLUME,ONLYRUIS,SETRUISFRQ,JUMP,EFFHULP+8
EFFPSG71:	DEFW	COPYVAR,PSGVOLUME,ONLYRUIS,SETRUISFRQ,JUMP,EFFHULP+2
EFFPSG72:	DEFW	ONLYTOON,WAITINT,PSONLYVOLU,PUTPSGFREQ,0D003H,WAITINT
	DEFW	PUTPSGFREQ,00007H,PSSLIDEVOL
	DEFB	248
	DEFW	WAITINT,PUTPSGFREQ,00009H,PSSLIDEVOL
	DEFB	253
	DEFW	PUTPSGFREQ,0000CH,WAITINT,PSGDECVOLU,SETPSGVOLU
	DEFB	0
	DEFW	ENDLESS
EFFPSG73:	DEFW	COPYVAR,ONLYRUIS,PSGVOLUME,SETRUISFRQ,WAITINT
	DEFW	SLIDERUIS
	DEFB	6
	DEFW	WAITINT,ONLYRUIS,PSSLIDEVOLU
	DEFB	252
	DEFW	WAITINT,PSGDECVOLU,SETPSGVOLU
	DEFB	0
	DEFW	ENDLESS
EFFPSG74:	DEFW	COPYVAR,PSGVOLUME,TOONRUIS,PUTPSGFREQ,00B00H,SETRUISFRQ
	DEFW	WAITINT,PUTPSGFREQ,00A00H,SLIDERUIS
	DEFB	254
	DEFW	PSSLIDEVOLU
	DEFB	253
	DEFW	WAITINT,PSGDECVOLU,PSSLIDEVOLU
	DEFB	2
	DEFW	SLIDERUIS
	DEFB	252
	DEFW	WAITINT,PSSLIDEVOLU
	DEFB	253
	DEFW	WAITINT,JUMPBACK
	DEFB	5
EFFPSG75:	DEFW	COPYVAR,PUTPSGFREQ,00D00H,PSONLYVOLU,SETRUISFRQ,TOONRUIS
	DEFW	WAITINT,PUTPSGFREQ,00B00H,PSSLIDEVOLU
	DEFB	254
	DEFW	WAITINT,SETPSGVOLU
	DEFB	0
	DEFW	ENDLESS
EFFPSG76:	DEFW	COPYVAR,WAITINT,PSGNOTVOLU,PSSLIDEVOLU
	DEFB	254
	DEFW	SETRUISFRQ,ONLYRUIS,WAITINT,PSGDECVOLU,WAITINT
	DEFW	PSGDECVOLU,WAITINT,WAITINT,WAITINT,SLIDERUIS
	DEFB	255
	DEFW	PSGDECVOLU,WAITINT,PSGDECVOLU,WAITINT,SETPSGVOLU
	DEFB	0
	DEFW	ENDLESS
EFFPSG77:	DEFW	WAITINT,SETPSGTIME,04200H,PUTPSGFREQ,0B001H,SETVOLU16
	DEFW	ONLYTOON,SOUND,00D0AH,WAITINT,WAITINT,ONLYRUIS,SOUND
	DEFW	00608H,SETPSGVOLU
	DEFB	10
	DEFW	PSGDECVOLU,JUMPBACK
	DEFB	2
EFFPSG78:	DEFW	COPYVAR,WAITINT,PSGNOTVOLU,WAITINT,WAITINT,WAITINT
	DEFW	PSGDECVOLU,WAITINT,ISTIJD2
	DEFB	4
	DEFW	ENDLESS
EFFPSG79:	DEFW	COPYVAR,PSGVOLUME,ONLYRUIS,SETRUISFRQ,WAITINT,SLIDERUIS
	DEFB	2
	DEFW	PSGDECVOLU,JUMPBACK
	DEFB	5
EFFPSG80:	DEFW	COPYVAR,PSGVOLUME,ONLYRUIS,SETRUISFRQ,WAITINT,SLIDERUIS
	DEFB	254
	DEFW	PSGDECVOLU,JUMPBACK
	DEFB	5

EFFHULP:	DEFW	WAITINT,WAITINT,WAITINT,WAITINT,WAITINT,WAITINT,WAITINT
	DEFW	WAITINT,SETPSGVOLU
	DEFB	0
	DEFW	ENDLESS

EFFFM1:	DEFW	FMOFF1,ENDLESS
EFFFM2:	DEFW	FMOFF2,ENDLESS
EFFFM3:	DEFW	FMNOTE,ENDLESS
EFFFM4:	DEFW	FMNOTVOLIN,ENDLESS
EFFFM5:	DEFW	FMNOTEVOLU
EFFFM6:	DEFW	COPYVAR,ISTIJD,FMDECVOLU,JUMPBACK
	DEFB	4
EFFFM7:	DEFW	FMNOTEVOLU,COPYVAR,ISTIJD,SETFMVOLU
	DEFB	15
	DEFW	ISTIJD,FMVOLUME,JUMPBACK
	DEFB	9
EFFFM8:	DEFW	FMNOTEVOLU,COPYVAR,ISTIJD,SETFMVOLU
	DEFB	15
EFFFM9:	DEFW	ENDLESS
EFFFM10:	DEFW	FMNOTE
EFFFM11:	DEFW	COPYVAR,FMVOLUME,FMSLIDEUPA,JUMPBACK
	DEFB	2
EFFFM12:	DEFW	FMNOTE
EFFFM13:	DEFW	COPYVAR,FMVOLUME,FMSLIDEUPB,JUMPBACK
	DEFB	2
EFFFM14:	DEFW	FMNOTE
EFFFM15:	DEFW	COPYVAR,FMVOLUME,ISTIJD,FMSLIDEUPC,JUMPBACK
	DEFB	4
EFFFM16:	DEFW	FMNOTE
EFFFM17:	DEFW	COPYVAR,FMVOLUME,FMSLIDEDOA,JUMPBACK
	DEFB	2
EFFFM18:	DEFW	FMNOTE
EFFFM19:	DEFW	COPYVAR,FMVOLUME,FMSLIDEDOB,JUMPBACK
	DEFB	2
EFFFM20:	DEFW	FMNOTE
EFFFM21:	DEFW	COPYVAR,FMVOLUME,ISTIJD,FMSLIDEDOC,JUMPBACK
	DEFB	4
EFFFM22:	DEFW	COPYVAR,FMVOLUME,FMSLIDEUPA,ENDLESS
EFFFM23:	DEFW	COPYVAR,FMVOLUME,FMSLIDEUPB,ENDLESS
EFFFM24:	DEFW	COPYVAR,FMVOLUME,FMSLIDEDOA,ENDLESS
EFFFM25:	DEFW	COPYVAR,FMVOLUME,FMSLIDEDOB,ENDLESS
EFFFM26:	DEFW	FMSTOPFREQ,ENDLESS
EFFFM27:	DEFW	FMONLYVOLU,ENDLESS
EFFFM28:	DEFW	FMNOTE
EFFFM29:	DEFW	COPYVAR,FMVOLUME,FMSLIDEDOD
	DEFB	3
	DEFW	ISTIJD,FMSLIDEUPD
	DEFB	3
	DEFW	ISTIJD,JUMPBACK
	DEFB	10
EFFFM30:	DEFW	FMNOTE
EFFFM31:	DEFW	COPYVAR,FMVOLUME,FMSLIDEDOD
	DEFB	8
	DEFW	ISTIJD,FMSLIDEUPD
	DEFB	8
	DEFW	ISTIJD,JUMPBACK
	DEFB	10
EFFFM32:	DEFW	FMNOTE
EFFFM33:	DEFW	COPYVAR,FMVOLUME,FMSLIDEDOD
	DEFB	15
	DEFW	ISTIJD,FMSLIDEUPD
	DEFB	15
	DEFW	ISTIJD,JUMPBACK
	DEFB	10
EFFFM34:	DEFW	FMNOTE
EFFFM35:	DEFW	COPYVAR,FMVOLUME,FMSLIDEDOD
	DEFB	30
	DEFW	ISTIJD,FMSLIDEUPD
	DEFB	30
	DEFW	ISTIJD,JUMPBACK
	DEFB	10
EFFFM36:	DEFW	FMNOTE
EFFFM37:	DEFW	COPYVAR,FMVOLUME,FMSLIDEDOC,ISTIJD2
	DEFB	2
	DEFW	FMSLIDEUPC,ISTIJD2
	DEFB	2
	DEFW	JUMPBACK
	DEFB	10
EFFFM38:	DEFW	FMNOTE
EFFFM39:	DEFW	COPYVAR,FMVOLUME,FMSLIDEDOD
	DEFB	2
	DEFW	ISTIJD2
	DEFB	3
	DEFW	FMSLIDEUPD
	DEFB	2
	DEFW	ISTIJD2
	DEFB	3
	DEFW	JUMPBACK
	DEFB	12
EFFFM40:	DEFW	FMNOTE
EFFFM41:	DEFW	COPYVAR,FMVOLUME,FMSLIDEDOD
	DEFB	4
	DEFW	ISTIJD2
	DEFB	3
	DEFW	FMSLIDEUPD
	DEFB	4
	DEFW	ISTIJD2
	DEFB	3
	DEFW	JUMPBACK
	DEFB	12
EFFFM42:	DEFW	FMNOTE
EFFFM43:	DEFW	COPYVAR,FMVOLUME,FMSLIDEDOC,WAITINT,ISTIJD2
	DEFB	4
	DEFW	FMSLIDEUPC,WAITINT,ISTIJD2
	DEFB	4
	DEFW	JUMPBACK
	DEFB	14
EFFFM44:	DEFW	FMNOTEVOLU,COPYVAR,WAITINT,WAITINT,FMDECVOLU,FMSLIDEUPA
	DEFW	JUMPBACK
	DEFB	4
EFFFM45:	DEFW	FMNOTEVOLU,COPYVAR,WAITINT,WAITINT,FMDECVOLU,FMSLIDEUPA
	DEFW	WAITINT,JUMPBACK
	DEFB	6
EFFFM46:	DEFW	FMNOTEVOLU,COPYVAR,WAITINT,WAITINT,FMDECVOLU,FMSLIDEDOA
	DEFW	JUMPBACK
	DEFB	4
EFFFM47:	DEFW	FMNOTEVOLU,COPYVAR,WAITINT,WAITINT,FMDECVOLU,FMSLIDEDOA
	DEFW	WAITINT,JUMPBACK
	DEFB	6
EFFFM48:	DEFW	SETSPEEDF,ENDLESS
EFFFM49:	DEFW	FMNOTEVOLU
EFFFM50:	DEFW	COPYVAR,FMDECVOLU,ISTIJD2
	DEFB	2
	DEFW	FMINCVOLU,ISTIJD2
	DEFB	2
	DEFW	JUMPBACK
	DEFB	10
EFFFM51:	DEFW	FMNOTEVOLU
EFFFM52:	DEFW	COPYVAR,FMDECVOLU,WAITINT,ISTIJD2
	DEFB	4
	DEFW	FMINCVOLU,WAITINT,ISTIJD2
	DEFB	4
	DEFW	JUMPBACK
	DEFB	14
EFFFM53:	DEFW	FMNOTEVOLU
EFFFM54:	DEFW	COPYVAR,FMDECVOLU,WAITINT,WAITINT,WAITINT,ISTIJD2
	DEFB	8
	DEFW	FMINCVOLU,WAITINT,WAITINT,WAITINT,ISTIJD2
	DEFB	8
	DEFW	JUMPBACK
	DEFB	22
EFFFM55:	DEFW	FMNOTEVOLU
EFFFM56:	DEFW	COPYVAR,ISTIJD,FMINCVOLU,JUMPBACK
	DEFB	4
EFFFM57:	DEFW	FMNOTEVOLU,COPYVAR,ISTIJD,WAITINT,FMSLIDEVOLU
	DEFB	253
	DEFW	ISTIJD,WAITINT
	DEFW	FMSLIDEVOLU
	DEFB	2
	DEFW	JUMPBACK
	DEFB	14
EFFFM58:	DEFW	FMNOTEVOLU,COPYVAR,ISTIJD,WAITINT,FMSLIDEVOL
	DEFB	252
	DEFW	ISTIJD,WAITINT
	DEFW	FMSLIDEVOLU
	DEFB	2
	DEFW	JUMPBACK
	DEFB	14
EFFFM59:	DEFW	FMNOTEVOLU,COPYVAR,ISTIJD,WAITINT,FMSLIDEVOL
	DEFB	250
	DEFW	ISTIJD,WAITINT
	DEFW	FMSLIDEVOL
	DEFB	3
	DEFW	JUMPBACK
	DEFB	14
EFFFM60:	DEFW	ENDLESS
EFFFM61:	EQU	EFFFM60
EFFFM62:	EQU	EFFFM60
EFFFM63:	EQU	EFFFM60
EFFFM64:	DEFW	INSTRUMENT,ENDLESS
EFFFM65:	EQU	EFFFM60
EFFFM66:	EQU	EFFFM60
EFFFM67:	EQU	EFFFM60
EFFFM68:	EQU	EFFFM60
EFFFM69:	EQU	EFFFM60
EFFFM70:	EQU	EFFFM60
EFFFM71:	EQU	EFFFM60
EFFFM72:	EQU	EFFFM60
EFFFM73:	EQU	EFFFM60
EFFFM74:	EQU	EFFFM60
EFFFM75:	EQU	EFFFM60
EFFFM76:	EQU	EFFFM60
EFFFM77:	EQU	EFFFM60
EFFFM78:	EQU	EFFFM60
EFFFM79:	EQU	EFFFM60
EFFFM80:	EQU	EFFFM60

;----------------------------------------------------------------------------

;Effect-routines

SETPSGTIME: LD	C,11
	LD	B,(IY+3)
	CALL	WRTPSG
	INC	C
	LD	B,(IY+2)
	CALL	WRTPSG
	LD	BC,4
	ADD	IY,BC
	RET

SOUND:	LD	B,(IY+2)
	LD	C,(IY+3)
	CALL	WRTPSG
	LD	BC,4
	ADD	IY,BC
	RET

PSSLIDEVOL: LD	A,(IX+74)
	LD	B,(IY+2)
	ADD	A,B
	CP	16
	JR	C,PSSLIDEVOB
	CP	200
	LD	A,15
	JR	C,PSSLIDEVOB
	XOR	A
PSSLIDEVOB: LD	(IX+74),A
	INC	IY
	INC	IY
	INC	IY
	LD	B,A
	LD	C,E
	JP	WRTVOLUPSG

FMSLIDEVOL: LD	A,(IX+74)
	AND	240
	LD	C,A
	LD	A,(IX+74)
	AND	15
	LD	B,(IY+2)
	SUB	B
	CP	16
	JR	C,FMSLIDEVOB
	CP	200
	LD	A,15
	JR	C,FMSLIDEVOB
	XOR	A
FMSLIDEVOB: OR	C
	LD	(IX+74),A
	INC	IY
	INC	IY
	INC	IY
	LD	B,A
	LD	C,E
	JP	WRTVOLUFMB

PUTPSGFREQ: LD	C,D
	LD	B,(IY+3)
	LD	(IX+73),B
	CALL	WRTPSG
	INC	C
	LD	B,(IY+2)
	LD	(IX+72),B
	CALL	WRTPSG
	LD	BC,4
	ADD	IY,BC
	RET

JUMP:	LD	L,(IY+2)
	LD	H,(IY+3)
	PUSH	HL
	POP	IY
	RET

TOONRUIS:	LD	BC,0B007H
	JR	ONLYRUISB

NOTOONRUIS: LD	BC,0BF07H
	JR	ONLYRUISB

ONLYTOON:	LD	BC,0B807H
	JR	ONLYRUISB

ONLYRUIS:	LD	BC,0B107H
ONLYRUISB:	INC	IY
	INC	IY
	JP	WRTPSG

SETVOLU16:	INC	IY
	INC	IY
	LD	A,(REPDECVOLU)
	CP	4
	LD	B,16
	JR	C,SETVOLU16B
	LD	B,0
SETVOLU16B: LD	C,E
	LD	(IX+74),B
	JP	WRTPSG

SETRUISFRQ: LD	B,(IX-81)
	DEC	B
	SLA	B
	LD	A,B
	LD	(RUISFREQ),A
	LD	C,6
	INC	IY
	INC	IY
	JP	WRTPSG

SLIDERUIS:	LD	A,(RUISFREQ)
	LD	B,(IY+2)
	ADD	A,B
	CP	32
	JR	C,SLIDERUISC
	LD	A,31
	CP	50
	JR	C,SLIDERUISC
	XOR	A
SLIDERUISC: LD	(RUISFREQ),A
	INC	IY
	INC	IY
	INC	IY
	LD	B,A
	LD	C,6
	JP	WRTPSG

FMSLIDEUPA: LD	L,(IX-81)
	JR	FMFREQUP

FMSLIDEUPB: LD	A,(IX-81)
	ADD	A,16
	LD	L,A
	JR	FMFREQUP

FMSLIDEUPC: LD	L,1
	JR	FMFREQUP

FMSLIDEUPD: LD	L,(IY+2)
	INC	IY

FMFREQUP:	LD	A,(IX+73)
	ADD	A,L
	LD	(IX+73),A
	PUSH	AF
	LD	B,A
	LD	C,D
	CALL	WRTOPLL
	POP	AF
	JR	NC,FMFREQUPC
	LD	A,(IX+72)
	AND	15
	OR	A
	JR	Z,FMFREQUPB
	INC	A
FMFREQUPB:	INC	A
	LD	(IX+72),A
	LD	B,A
	SET	4,B
	LD	C,E
	RES	4,C
	CALL	WRTOPLL
FMFREQUPC:	INC	IY
	INC	IY
	POP	AF
	RET

FMSLIDEDOA: LD	L,(IX-81)
	JR	FMFREQDOWN

FMSLIDEDOB: LD	A,(IX-81)
	ADD	A,16
	LD	L,A
	JR	FMFREQDOWN

FMSLIDEDOC: LD	L,1
	JR	FMFREQDOWN

FMSLIDEDOD: LD	L,(IY+2)
	INC	IY

FMFREQDOWN: LD	A,(IX+73)
	SUB	L
	LD	(IX+73),A
	PUSH	AF
	LD	B,A
	LD	C,D
	CALL	WRTOPLL
	POP	AF
	JR	NC,FMFREQDOWC
	LD	A,(IX+72)
	AND	15
	CP	1
	JR	Z,FMFREQDOWB
	DEC	A
FMFREQDOWB: DEC	A
	LD	(IX+72),A
	LD	B,A
	SET	4,B
	LD	C,E
	RES	4,C
	CALL	WRTOPLL
FMFREQDOWC: INC	IY
	INC	IY
	POP	AF
	RET

PSSLIDEUPA: LD	L,(IX-81)
	JR	PSGFREQUP

PSSLIDEUPB: LD	A,(IX-81)
	ADD	A,16
	LD	L,A
	JR	PSGFREQUP

PSSLIDEUPC: LD	L,1
	JR	PSGFREQUP

PSSLIDEUPD: LD	L,(IY+2)
	INC	IY

PSGFREQUP:	LD	A,L
	NEG
	LD	L,A
	LD	H,255
	JR	PSGFREQDOB

PSSLIDEDOA: LD	L,(IX-81)
	JR	PSGFREQDOW

PSSLIDEDOB: LD	A,(IX-81)
	ADD	A,16
	LD	L,A
	JR	PSGFREQDOW

PSSLIDEDOC: LD	L,1
	JR	PSGFREQDOW

PSSLIDEDOD: LD	L,(IY+2)
	INC	IY

PSGFREQDOW: LD	H,0
PSGFREQDOB: LD	C,(IX+73)
	LD	B,(IX+72)
	ADD	HL,BC
	LD	(IX+73),L
	LD	(IX+72),H
	LD	B,L
	LD	C,D
	CALL	WRTPSG
	LD	B,H
	INC	C
	CALL	WRTPSG
	INC	IY
	INC	IY
	POP	AF
	RET

FMOFF2:	LD	A,(IX+72)
	AND	15
	OR	32
	JR	FMOFF1B

FMOFF1:	LD	A,(IX+72)
	AND	15
FMOFF1B:	LD	B,A
	LD	C,E
	RES	4,C
	CALL	WRTOPLL
	INC	IY
	INC	IY
	POP	AF
	RET

SETPSGVOLU: LD	B,(IY+2)
	LD	(IX+74),B
	INC	IY
	INC	IY
	INC	IY
	POP	AF
	LD	C,E
	JP	WRTVOLUPSG

SETFMVOLU:	LD	A,(IX+74)
	AND	240
	LD	B,A
	LD	A,(IY+2)
	AND	15
	OR	B
	LD	(IX+74),A
	LD	B,A
	LD	C,E
	INC	IY
	INC	IY
	INC	IY
	POP	AF
	JP	WRTVOLUFMB

FMSTOPFREQ: CALL	FMONLYVOLB
	JR	FMNOTE3

FMNOTEVOLU: CALL	FMONLYVOLB
	JR	FMNOTE2

FMONLYVOLU: CALL	FMONLYVOLB
	INC	IY
	INC	IY
	POP	AF
	RET

FMONLYVOLB: LD	L,(IX+3)
	LD	H,(IX+4)
	INC	HL
	LD	A,(IX+74)
	AND	240
	LD	B,A
	LD	A,(HL)
	AND	15
	OR	B
	LD	(IX+74),A
	LD	B,A
	LD	C,E
	JP	WRTVOLUFMB

FMNOTVOLIN: LD	L,(IX+3)
	LD	H,(IX+4)
	INC	HL
	LD	B,(HL)
	LD	C,E
	LD	(IX+74),B
	CALL	WRTVOLUFMB
	JR	FMNOTE2

FMNOTE:	LD	L,(IX+3)
	LD	H,(IX+4)
	INC	HL
FMNOTE2:	LD	C,E
	RES	4,C
	LD	B,0
	CALL	WRTOPLL
FMNOTE3:	INC	HL
	LD	B,0
	LD	C,(HL)
	LD	HL,FMTONEN
	ADD	HL,BC
	LD	B,(HL)
	LD	C,D
	LD	(IX+73),B
	CALL	WRTOPLL
	LD	C,E
	RES	4,C
	INC	HL
	LD	B,(HL)
	LD	(IX+72),B
	SET	4,B
	CALL	WRTOPLL
	INC	IY
	INC	IY
	POP	AF
	RET

SETSPEEDP:	LD	B,0
	JR	SETSPEED
SETSPEEDF:	LD	B,15
SETSPEED:	LD	L,(IX+3)
	LD	H,(IX+4)
	INC	HL
	LD	A,(HL)
	XOR	B
	RRC	A
	RRC	A
	RRC	A
	RRC	A
	ADD	A,3
	CP	3
	JR	NC,SETSPEED2
	LD	A,255
SETSPEED2:	LD	(REPSPEED),A
	INC	IY
	INC	IY
	POP	AF
	RET

JUMPBACK:	LD	A,(IY+2)
	NEG
	LD	C,A
	LD	B,255
	ADD	IY,BC
	RET

WAITINT:	INC	IY
	INC	IY
	POP	AF
	RET

FMDECVOLU:	INC	IY
	INC	IY
	POP	AF
	LD	A,(IX+74)
	AND	15
	CP	15
	RET	Z
	LD	B,(IX+74)
	INC	B
	LD	(IX+74),B
	LD	C,E
	JP	WRTVOLUFMB

FMINCVOLU:	INC	IY
	INC	IY
	POP	AF
	LD	A,(IX+74)
	LD	B,A
	AND	15
	RET	Z
	DEC	B
	LD	(IX+74),B
	LD	C,E
	JP	WRTVOLUFMB

PSGDECVOLU: POP	AF
PSGDECVOLB: INC	IY
	INC	IY
	LD	A,(IX+74)
	AND	15
	RET	Z
	DEC	A
	LD	(IX+74),A
	LD	B,A
	LD	C,E
	JP	WRTVOLUPSG

PSGINCVOLU: POP	AF
PSGINCVOLB: INC	IY
	INC	IY
	LD	A,(IX+74)
	AND	15
	CP	15
	RET	Z
	INC	A
	LD	(IX+74),A
	LD	B,A
	LD	C,E
	JP	WRTVOLUPSG

ISTIJD:	DEC	(IX-80)
	JR	Z,ISTIJDB
	POP	AF
	RET
ISTIJDB:	LD	A,(IX-81)
	LD	(IX-80),A
	INC	IY
	INC	IY
	RET

ISTIJD2:	DEC	(IX-80)
	JP	NZ,JUMPBACK
	LD	A,(IX-81)
	LD	(IX-80),A
	INC	IY
	INC	IY
	INC	IY
	RET

COPYVAR:	LD	L,(IX+3)
	LD	H,(IX+4)
	INC	HL
	LD	A,(HL)
	LD	(IX-79),A
	SRL	A
	SRL	A
	SRL	A
	SRL	A
	INC	A
	LD	(IX-81),A
	LD	(IX-80),A
	INC	HL
	LD	A,(HL)
	LD	(IX-78),A
	INC	IY
	INC	IY
	RET

PSGVOLUME:	LD	A,(IX-79)
	AND	15
	LD	B,A
	LD	C,E
	LD	(IX+74),B
	INC	IY
	INC	IY
	POP	AF
	JP	WRTVOLUPSG

FMVOLUME:	LD	A,(IX+74)
	AND	240
	LD	B,A
	LD	A,(IX-79)
	AND	15
	OR	B
	LD	B,A
	LD	C,E
	LD	(IX+74),B
	INC	IY
	INC	IY
	POP	AF
	JP	WRTVOLUFMB

PSGNOTVOLU: CALL	PSONLYVOLB
	JR	PSGNOT2

PSONLYVOLU: CALL	PSONLYVOLB
	INC	IY
	INC	IY
	POP	AF
	RET

PSONLYVOLB: LD	L,(IX+3)
	LD	H,(IX+4)
	INC	HL
	LD	A,(HL)
	AND	15
	LD	B,A
	LD	C,E
	LD	(IX+74),B
	JP	WRTVOLUPSG

INSTRUMENT: LD	L,(IX+3)
	LD	H,(IX+4)
	INC	HL
	LD	A,(HL)
	LD	(IX+74),A
	LD	B,A
	LD	C,E
	INC	IY
	INC	IY
	POP	AF
	JP	WRTVOLUFMB

PSGNOT:	LD	L,(IX+3)
	LD	H,(IX+4)
	INC	HL
PSGNOT2:	INC	HL
	LD	C,(HL)
	LD	B,0
	LD	HL,PSGTONEN
	ADD	HL,BC
	LD	B,(HL)
	LD	C,D
	LD	(IX+73),B
	CALL	WRTPSG
	INC	C
	INC	HL
	LD	B,(HL)
	LD	(IX+72),B
	CALL	WRTPSG
	INC	IY
	INC	IY
	POP	AF

PSGRUISOFF: LD	A,D
	OR	A
	RET	NZ
	LD	BC,0F807H
	JP	WRTPSG

PSGOFF:	LD	C,D
	LD	B,0
	CALL	WRTPSG
	INC	C
	CALL	WRTPSG
	LD	(IX+72),B
	LD	(IX+73),B
	INC	IY
	INC	IY
	POP	AF
	RET

PUTINSTRU0: LD	L,(IX+3)
	LD	H,(IX+4)
	LD	BC,00800H
PUTINSTR0B: INC	HL
	LD	A,(HL)
	CALL	WRTOPLL3
	INC	C
	DJNZ	PUTINSTR0B
	INC	IY
	INC	IY
	POP	AF
	RET

ENDLESS:	POP	AF
	RET

PUTDRUMS:	LD	L,(IX+3)
	LD	H,(IX+4)
	LD	BC,0000EH
	CALL	WRTOPLL
	LD	C,038H
	LD	B,(HL)
	CALL	WRTVOLUFMA
	INC	HL
	DEC	C
	LD	B,(HL)
	CALL	WRTVOLUFMA
	INC	HL
	DEC	C
	LD	B,(HL)
	CALL	WRTVOLUFMB
	LD	A,B
	LD	B,4
PUTDRUMSB:	SRL	A
	DJNZ	PUTDRUMSB
	INC	HL
	LD	C,(HL)
	SLA	C
	RL	A
	OR	32
	LD	B,A
	LD	A,14
	CALL	WRTOPLL2
	INC	IY
	INC	IY
	POP	AF
	RET


;----------------------------------------------------------------------------

; De volgende data bevat de frequenties van alle PSG noten (8 octaafs)

PSGTONEN:	DEFB	242,7,128,7,20,7,93,13,93,13,156,12,231,11,60,11
	DEFB	155,10,2,10,2,10,115,9,235,8,107,8,0,0,0,0
	DEFB	249,3,192,3,138,3,175,6,175,6,78,6,244,5,158,5
	DEFB	78,5,1,5,1,5,186,4,118,4,54,4,0,0,0,0
	DEFB	253,1,224,1,197,1,87,3,87,3,39,3,250,2,207,2
	DEFB	167,2,129,2,129,2,93,2,59,2,27,2,0,0,0,0
	DEFB	254,0,240,0,227,0,172,1,172,1,148,1,125,1,104,1
	DEFB	83,1,64,1,64,1,46,1,29,1,13,1,0,0,0,0
	DEFB	127,0,120,0,113,0,214,0,214,0,202,0,190,0,180,0
	DEFB	170,0,160,0,160,0,151,0,143,0,135,0,0,0,0,0
	DEFB	64,0,60,0,57,0,107,0,107,0,101,0,95,0,90,0
	DEFB	85,0,80,0,80,0,76,0,71,0,67,0,0,0,0,0
	DEFB	32,0,30,0,28,0,53,0,53,0,50,0,48,0,45,0
	DEFB	42,0,40,0,40,0,38,0,36,0,34,0,0,0,0,0
	DEFB	16,0,15,0,14,0,27,0,27,0,25,0,24,0,22,0
	DEFB	21,0,20,0,20,0,19,0,18,0,17,0,0,0,0,0

;Deze data bevat alle frequenties van de FM noten (8 octaafs)

FMTONEN:	DEFB	34,1,51,1,69,1,172,0,172,0,182,0,193,0,205,0
	DEFB	217,0,230,0,230,0,244,0,2,1,17,1,0,0,0,0
	DEFB	34,3,51,3,69,3,89,1,89,1,109,1,131,1,154,1
	DEFB	178,1,204,1,204,1,232,1,2,3,17,3,0,0,0,0
	DEFB	34,5,51,5,69,5,89,3,89,3,109,3,131,3,154,3
	DEFB	178,3,204,3,204,3,232,3,2,5,17,5,0,0,0,0
	DEFB	34,7,51,7,69,7,89,5,89,5,109,5,131,5,154,5
	DEFB	178,5,204,5,204,5,232,5,2,7,17,7,0,0,0,0
	DEFB	34,9,51,9,69,9,89,7,89,7,109,7,131,7,154,7
	DEFB	178,7,204,7,204,7,232,7,2,9,17,9,0,0,0,0
	DEFB	34,11,51,11,69,11,89,9,89,9,109,9,131,9,154,9
	DEFB	178,9,204,9,204,9,232,9,2,11,17,11,0,0,0,0
	DEFB	34,13,51,13,69,13,89,11,89,11,109,11,131,11,154,11
	DEFB	178,11,204,11,204,11,232,11,2,13,17,13,0,0,0,0
	DEFB	34,15,51,15,69,15,89,13,89,13,109,13,131,13,154,13
	DEFB	178,13,204,13,204,13,232,13,2,15,17,15,0,0,0,0


;-----------------------------------------------------------------------------


;Routines die rechtsstreeks naar de OPLL-chip en naar de PSG schrijven.

WRTOPLL:	LD	A,C
	OUT	(07CH),A
	EX	(SP),HL
	EX	(SP),HL
	LD	A,B
	NOP
	OUT	(07DH),A
	RET

WRTOPLL2:	OUT	(07CH),A
	EX	(SP),HL
	EX	(SP),HL
	PUSH	AF
	LD	A,B
	OUT	(07DH),A
	POP	AF
	RET

WRTOPLL3:	PUSH	AF
	LD	A,C
	OUT	(07CH),A
	EX	(SP),HL
	EX	(SP),HL
	POP	AF
	NOP
	OUT	(07DH),A
	RET

WRTVOLUFMA: LD	A,B
	AND	15
	LD	DE,(REPDECVOLU)
	ADD	A,E
	BIT	4,A
	JR	Z,WRTVOLFMA2
	LD	A,15
WRTVOLFMA2: LD	D,A
	LD	A,C
	OUT	(07CH),A
	SLA	E
	SLA	E
	SLA	E
	SLA	E
	LD	A,B
	AND	240
	ADD	A,E
	JR	NC,WRTVOLFMA3
	LD	A,240
WRTVOLFMA3: OR	D
	OUT	(07DH),A
	RET

WRTVOLUFMB: PUSH	DE
	LD	A,C
	OUT	(07CH),A
	LD	A,B
	AND	15
	LD	DE,(REPDECVOLU)
	ADD	A,E
	BIT	4,A
	JR	Z,WRTVOLFMB2
	LD	A,15
WRTVOLFMB2: LD	D,A
	LD	A,B
	AND	240
	OR	D
	OUT	(07DH),A
	POP	DE
	RET

WRTVOLUPSG: LD	A,C
	OUT	(0A0H),A
	LD	A,B
	LD	BC,(REPDECVOLU)
	SUB	C
	BIT	7,A
	JR	Z,WRTVOLUPS2
	XOR	A
WRTVOLUPS2: OUT	(0A1H),A
	RET

WRTPSG:	LD	A,C
	OUT	(0A0H),A
	LD	A,B
	OUT	(0A1H),A
	RET

WRTPSG2:	OUT	(0A0H),A
	PUSH	AF
	LD	A,B
	OUT	(0A1H),A
	POP	AF
	RET

WRTPSG3:	PUSH	AF
	LD	A,C
	OUT	(0A0H),A
	POP	AF
	OUT	(0A1H),A
	RET

READPSG:	OUT	(0A0H),A
	IN	A,(0A2H)
	RET

;----------------------------------------------------------------------------

EINDE:	NOP

